#include "../lvgl/lvgl.h"
#include "iu_manage.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static lv_obj_t * pick_up_screen  = NULL;
static lv_obj_t * textarea        = NULL; // 添加全局文本框引用
static OrderInfo * current_orders = NULL; // 当前显示的订单信息
static int current_order_count    = 0;    // 当前订单数量

// 添加一个标志来跟踪pick_up_screen是否被隐藏
static bool pick_up_screen_hidden = false;

// 函数声明
static void delete_screen_timer_cb(lv_timer_t * timer);
static void confirm_button_event_handler(lv_event_t * e);
static void pickup_msgbox_event_handler(lv_event_t * e);
static void create_pick_up_ta_event_cb(lv_event_t * e);
static bool validate_and_load_orders(const char * input, OrderInfo * orders, int * order_count, int max_orders);
static void mask_phone_number(char * masked_phone, const char * phone);
static void update_buy_file(OrderInfo * orders, int order_count);
static void show_pickup_success_animation(void);
static void close_msgbox_simple_cb(lv_timer_t * timer);
static void safe_delete_msgbox(lv_obj_t * msgbox);

static void create_pick_up_ta_event_cb(lv_event_t * e)
{
    // 获取事件类型（如焦点获取、焦点丢失等）
    lv_event_code_t code = lv_event_get_code(e);
    // 获取触发事件的文本框对象（当前操作的输入框）
    lv_obj_t * ta = lv_event_get_target(e);
    // 获取用户数据（这里传入的是虚拟键盘对象，用于关联输入）
    lv_obj_t * kb = lv_event_get_user_data(e);

    // 当文本框获得焦点（用户点击输入框准备输入）
    if(code == LV_EVENT_FOCUSED) {
        // 将键盘与当前文本框绑定，确保输入内容显示到该文本框
        lv_keyboard_set_textarea(kb, ta);
        // 清除键盘的"隐藏"标志，使键盘显示在界面上
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
    }

    // 当文本框失去焦点（用户点击其他区域结束输入）
    if(code == LV_EVENT_DEFOCUSED) {
        // 解除键盘与文本框的绑定，避免输入内容错误关联
        lv_keyboard_set_textarea(kb, NULL);
        // 为键盘添加"隐藏"标志，使键盘从界面上消失
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
    }
}

void create_pick_up_keyboard(lv_obj_t * parent)
{
    /* 创建虚拟键盘对象，父容器为传入的parent（确保键盘属于取票界面） */
    lv_obj_t * kb = lv_keyboard_create(parent);
    if(!kb) return;
    // 设置键盘背景透明度为80%（半透明），既清晰可见又不完全遮挡下层内容
    lv_obj_set_style_bg_opa(kb, LV_OPA_80, 0);

    // 设置键盘模式为特殊字符模式，显示更多功能键（如删除、确认等图标）
    lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_SPECIAL);

    // 为键盘设置字体（使用包含符号的内置字体，确保功能图标正常显示）
    lv_obj_set_style_text_font(kb, &lv_font_montserrat_24, LV_PART_MAIN);

    /* 创建第一个文本输入框（用于输入取票码或手机号），父容器为parent */
    lv_obj_t * ta = lv_textarea_create(parent);
    if(!ta) return;
    // 将文本框对齐到父容器顶部中间，距离顶部60像素（预留标题空间）
    lv_obj_align(ta, LV_ALIGN_TOP_MID, 0, 60);
    // 为文本框绑定事件回调函数，传入键盘对象kb作为用户数据（实现联动）
    lv_obj_add_event_cb(ta, create_pick_up_ta_event_cb, LV_EVENT_ALL, kb);
    // 设置文本框的提示文本（未输入时显示的灰色提示信息）
    lv_textarea_set_placeholder_text(ta, "请输入取票码或手机号");
    // 设置文本框尺寸为300×80像素（宽度300，高度80）
    lv_obj_set_size(ta, 300, 80);
    // 为文本框设置中文字体，确保"取票码"等中文正常显示
    lv_obj_set_style_text_font(ta, &SourceHanSansCN_Light_2_16_all, LV_PART_MAIN);

    // 保存文本框引用
    textarea = ta;

    // 将键盘默认绑定到创建的文本框（初始激活状态）
    lv_keyboard_set_textarea(kb, ta);
    // 初始状态下隐藏键盘（添加隐藏标志，节省界面空间）
    lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);

    // 调整键盘尺寸：宽度为屏幕100%（满宽），高度为屏幕50%（占据下半部分）
    lv_obj_set_size(kb, LV_PCT(100), LV_PCT(50));
    // 将键盘对齐到父容器底部中间（符合用户输入习惯，键盘通常在底部）
    lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);

    // 创建确认按钮
    lv_obj_t * confirm_btn = lv_btn_create(parent);
    if(!confirm_btn) return;
    lv_obj_set_size(confirm_btn, 100, 40);
    lv_obj_align(confirm_btn, LV_ALIGN_TOP_MID, 0, 160);
    lv_obj_set_style_bg_color(confirm_btn, lv_color_hex(0x007bff), 0);
    lv_obj_set_style_text_color(confirm_btn, lv_color_hex(0xffffff), 0);

    lv_obj_t * confirm_label = lv_label_create(confirm_btn);
    if(confirm_label) {
        lv_label_set_text(confirm_label, "确认");
        lv_obj_center(confirm_label);
    }

    // 添加确认按钮事件处理
    lv_obj_add_event_cb(confirm_btn, confirm_button_event_handler, LV_EVENT_CLICKED, NULL);
}
// 按钮点击事件回调函数

void pick_up_button_click_handler(lv_event_t * e)
{
    LV_LOG_USER("Button clicked!"); // 添加日志以便调试

    if(e == NULL) {
        LV_LOG_USER("Event is NULL");
        return;
    }

    lv_event_code_t code = lv_event_get_code(e);
    LV_LOG_USER("Event code: %d", code);

    if(code == LV_EVENT_CLICKED) {
        LV_LOG_USER("Handling button click");
        // 隐藏当前界面而不是删除
        if(pick_up_screen) {
            lv_obj_add_flag(pick_up_screen, LV_OBJ_FLAG_HIDDEN);
            pick_up_screen_hidden = true;
        }
        // 跳转到广告机页面
        create_image_slideshow();
    }
}
// 用于延迟删除屏幕的定时器回调函数
static void delete_screen_timer_cb(lv_timer_t * timer)
{
    lv_obj_t * screen = timer->user_data;
    if(screen) {
        lv_obj_add_flag(screen, LV_OBJ_FLAG_HIDDEN);
    }
    // 删除定时器自身
    lv_timer_del(timer);
}
// 隐藏手机号中间4位
static void mask_phone_number(char * masked_phone, const char * phone)
{
    if(!masked_phone || !phone) return;

    int len = strlen(phone);
    if(len != 11) {
        strcpy(masked_phone, phone);
        return;
    }

    strcpy(masked_phone, phone);
    for(int i = 3; i < 7; i++) {
        masked_phone[i] = '*';
    }
}

// 验证并加载订单信息
static bool validate_and_load_orders(const char * input, OrderInfo * orders, int * order_count, int max_orders)
{
    if(!input || !orders || !order_count) return false;

    FILE * file = fopen("buy.txt", "r");
    if(!file) {
        LV_LOG_USER("Failed to open buy.txt");
        return false;
    }

    *order_count = 0;
    char line[1024];
    bool is_phone_search = (strlen(input) == 11 && strspn(input, "0123456789") == strlen(input));

    while(fgets(line, sizeof(line), file) && *order_count < max_orders) {
        // 解析buy.txt中的行：用户名,号码,电影名,日期,场次,座位号,取票号,取票情况,取票时间
        char username[50], phone[20], movie_name[100], date[20], time_str[20], seat[50], ticket_number[50];
        int picked_up;
        char pickup_time[30];

        int fields = sscanf(line, "%49[^,],%19[^,],%99[^,],%19[^,],%19[^,],%49[^,],%49[^,],%d,%29[^\n]", username,
                            phone, movie_name, date, time_str, seat, ticket_number, &picked_up, pickup_time);

        if(fields == 9) {
            // 只处理未取票的订单 (picked_up == 0)
            if(picked_up == 0) {
                // 检查是否匹配（手机号或取票号）
                bool match = false;
                if(is_phone_search) {
                    // 手机号搜索
                    match = (strcmp(phone, input) == 0);
                } else {
                    // 取票号搜索
                    match = (strcmp(ticket_number, input) == 0);
                }

                // 如果匹配，加载订单信息
                if(match) {
                    OrderInfo * order = &orders[*order_count];
                    strcpy(order->username, username);
                    strcpy(order->phone, phone);
                    strcpy(order->movie_name, movie_name);
                    strcpy(order->date, date);
                    strcpy(order->time, time_str);
                    strcpy(order->seat, seat);
                    strcpy(order->ticket_number, ticket_number);
                    order->picked_up = picked_up;
                    strcpy(order->pickup_time, pickup_time);

                    (*order_count)++;
                }
            }
        }
    }

    fclose(file);
    return (*order_count > 0);
}

// 更新buy.txt文件中的取票状态
static void update_buy_file(OrderInfo * orders, int order_count)
{
    if(!orders || order_count <= 0) return;

    // 读取原文件内容
    FILE * file = fopen("buy.txt", "r");
    if(!file) {
        LV_LOG_USER("Failed to open buy.txt for reading");
        return;
    }

    // 创建临时文件
    FILE * temp_file = fopen("buy_temp.txt", "w");
    if(!temp_file) {
        LV_LOG_USER("Failed to create temporary file");
        fclose(file);
        return;
    }

    char line[1024];
    while(fgets(line, sizeof(line), file)) {
        // 解析当前行
        char username[50], phone[20], movie_name[100], date[20], time_str[20], seat[50], ticket_number[50];
        int picked_up;
        char pickup_time[30];

        int fields = sscanf(line, "%49[^,],%19[^,],%99[^,],%19[^,],%19[^,],%49[^,],%49[^,],%d,%29[^\n]", username,
                            phone, movie_name, date, time_str, seat, ticket_number, &picked_up, pickup_time);

        if(fields == 9) {
            // 检查是否需要更新此订单
            bool updated = false;
            for(int i = 0; i < order_count; i++) {
                OrderInfo * order = &orders[i];
                // 检查是否是同一订单（通过用户名、手机号、电影名、日期、时间、座位号匹配）
                if(strcmp(order->username, username) == 0 && strcmp(order->phone, phone) == 0 &&
                   strcmp(order->movie_name, movie_name) == 0 && strcmp(order->date, date) == 0 &&
                   strcmp(order->time, time_str) == 0 && strcmp(order->seat, seat) == 0) {

                    // 写入更新后的行（标记为已取票，并添加取票时间）
                    time_t now;
                    time(&now);
                    struct tm * tm_info = localtime(&now);
                    char pickup_time_str[30];
                    strftime(pickup_time_str, sizeof(pickup_time_str), "%Y-%m-%d %H:%M:%S", tm_info);

                    fprintf(temp_file, "%s,%s,%s,%s,%s,%s,%s,1,%s\n", username, phone, movie_name, date, time_str, seat,
                            ticket_number, pickup_time_str);
                    updated = true;
                    break;
                }
            }

            // 如果不需要更新，原样写入
            if(!updated) {
                fputs(line, temp_file);
            }
        } else {
            // 格式不匹配的行原样写入
            fputs(line, temp_file);
        }
    }

    fclose(file);
    fclose(temp_file);

    // 替换原文件
    remove("buy.txt");
    rename("buy_temp.txt", "buy.txt");
}

// 取票成功动画
static void show_pickup_success_animation(void)
{
    // 创建一个全屏遮罩
    lv_obj_t * mask = lv_obj_create(lv_scr_act());
    lv_obj_set_size(mask, LV_HOR_RES, LV_VER_RES);
    lv_obj_set_style_bg_color(mask, lv_color_hex(0x000000), 0);
    lv_obj_set_style_bg_opa(mask, LV_OPA_70, 0);
    lv_obj_align(mask, LV_ALIGN_CENTER, 0, 0);

    // 创建提示文本
    lv_obj_t * label = lv_label_create(mask);
    lv_label_set_text(label, "正在出票...");
    lv_obj_set_style_text_color(label, lv_color_hex(0xffffff), 0);
    lv_obj_set_style_text_font(label, &SourceHanSansCN_Light_2_16_all, 0);
    lv_obj_center(label);

    // 3秒后隐藏遮罩并返回广告机页面
    lv_timer_t * timer = lv_timer_create(delete_screen_timer_cb, 3000, mask);
    lv_timer_set_repeat_count(timer, 1);
}

// 消息框事件处理函数
static void pickup_msgbox_event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * msgbox    = lv_event_get_current_target(e);

    if(code == LV_EVENT_VALUE_CHANGED) {
        const char * txt = lv_msgbox_get_active_btn_text(msgbox);
        if(txt) {
            if(strcmp(txt, "确认") == 0) {
                // 更新buy.txt文件
                update_buy_file(current_orders, current_order_count);

                // 关闭消息框
                lv_msgbox_close(msgbox);

                // 显示出票动画并返回广告机页面
                show_pickup_success_animation();
            } else if(strcmp(txt, "取消") == 0) {
                // 关闭消息框
                lv_msgbox_close(msgbox);
            }
        }
    }
}

// 确认按钮事件处理函数
static void confirm_button_event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);

    if(code == LV_EVENT_CLICKED) {
        if(!textarea) {
            LV_LOG_USER("Textarea is NULL");
            return;
        }

        const char * input = lv_textarea_get_text(textarea);
        if(!input || strlen(input) == 0) {
            // 显示错误提示
            lv_obj_t * msgbox = lv_msgbox_create(NULL, "错误", "请输入取票码或手机号", NULL, false);
            lv_obj_center(msgbox);
            lv_timer_t * timer = lv_timer_create(close_msgbox_simple_cb, 2000, msgbox);
            lv_timer_set_repeat_count(timer, 1);
            return;
        }

        // 验证输入是否为11位手机号或取票号
        bool is_valid = false;
        if(strlen(input) == 11 && strspn(input, "0123456789") == 11) {
            // 11位数字，认为是手机号
            is_valid = true;
        } else if(strlen(input) > 0) {
            // 其他情况认为是取票号
            is_valid = true;
        }

        if(!is_valid) {
            lv_obj_t * msgbox = lv_msgbox_create(NULL, "错误", "输入格式不正确", NULL, false);
            lv_obj_center(msgbox);
            lv_timer_t * timer = lv_timer_create(close_msgbox_simple_cb, 2000, msgbox);
            lv_timer_set_repeat_count(timer, 1);
            return;
        }

        // 释放之前的订单信息内存
        if(current_orders) {
            free(current_orders);
            current_orders      = NULL;
            current_order_count = 0;
        }

        // 分配内存存储订单信息
        current_orders = malloc(sizeof(OrderInfo) * 10); // 最多处理10个订单
        if(!current_orders) {
            lv_obj_t * msgbox = lv_msgbox_create(NULL, "错误", "内存不足", NULL, false);
            lv_obj_center(msgbox);
            lv_timer_t * timer = lv_timer_create(close_msgbox_simple_cb, 2000, msgbox);
            lv_timer_set_repeat_count(timer, 1);
            return;
        }

        // 加载匹配的订单信息
        if(validate_and_load_orders(input, current_orders, &current_order_count, 10)) {
            if(current_order_count > 0) {
                // 构建订单信息显示文本
                char info_text[2048]  = {0};
                char masked_phone[20] = {0};

                for(int i = 0; i < current_order_count; i++) {
                    OrderInfo * order = &current_orders[i];

                    // 隐藏手机号中间4位
                    mask_phone_number(masked_phone, order->phone);

                    // 添加订单信息到显示文本
                    char order_info[500];
                    snprintf(order_info, sizeof(order_info),
                             "用户: %s\n电话: %s\n电影: %s\n日期: %s\n时间: %s\n座位: %s\n取票号: %s\n\n",
                             order->username, masked_phone, order->movie_name, order->date, order->time, order->seat,
                             order->ticket_number);

                    strcat(info_text, order_info);
                }

                // 创建确认消息框
                static const char * btn_texts[] = {"取消", "确认", ""};
                lv_obj_t * msgbox               = lv_msgbox_create(NULL, "订单信息", info_text, btn_texts, false);
                lv_obj_center(msgbox);
                lv_obj_set_style_max_width(msgbox, 500, 0);
                lv_obj_set_style_max_height(msgbox, 300, 0);

                // 添加事件处理函数
                lv_obj_add_event_cb(msgbox, pickup_msgbox_event_handler, LV_EVENT_VALUE_CHANGED, NULL);
            } else {
                // 没有找到匹配的未取票订单
                lv_obj_t * msgbox = lv_msgbox_create(NULL, "提示", "未找到匹配的未取票订单", NULL, false);
                lv_obj_center(msgbox);
                lv_timer_t * timer = lv_timer_create(close_msgbox_simple_cb, 2000, msgbox);
                lv_timer_set_repeat_count(timer, 1);
            }
        } else {
            // 文件读取失败或其他错误
            lv_obj_t * msgbox = lv_msgbox_create(NULL, "错误", "系统错误，请稍后重试", NULL, false);
            lv_obj_center(msgbox);
            lv_timer_t * timer = lv_timer_create(close_msgbox_simple_cb, 2000, msgbox);
            lv_timer_set_repeat_count(timer, 1);
        }
    }
}
// 简单关闭消息框的定时器回调（用于提示信息等不需要页面跳转的场景）
static void close_msgbox_simple_cb(lv_timer_t * timer)
{
    lv_obj_t * msgbox = (lv_obj_t *)timer->user_data;
    if(msgbox) {
        lv_msgbox_close(msgbox);
    }

    // 删除定时器本身以避免内存泄漏
    lv_timer_del(timer);
}

// 安全删除对象的辅助函数，确保删除所有相关对象包括遮罩层
static void safe_delete_msgbox(lv_obj_t * msgbox)
{
    if(!msgbox) return;

    // 使用标准的消息框关闭函数处理所有情况
    lv_msgbox_close(msgbox);
}
// 第一个界面UI初始化
void pick_up_screen_init(void)
{
    // 如果pick_up_screen已经存在，直接显示它
    if(pick_up_screen) {
        if(pick_up_screen_hidden) {
            lv_obj_clear_flag(pick_up_screen, LV_OBJ_FLAG_HIDDEN);
            pick_up_screen_hidden = false;
        }
        // 使用渐变动画加载界面，减少白屏时间
        lv_scr_load_anim(pick_up_screen, LV_SCR_LOAD_ANIM_FADE_ON, 300, 0, false);
        return;
    }

    // 创建取票界面屏幕对象
    pick_up_screen = lv_obj_create(NULL);
    if(!pick_up_screen) {
        LV_LOG_USER("Failed to create pick up screen");
        return;
    }

    lv_obj_set_size(pick_up_screen, 800, 480);
    lv_obj_set_style_bg_color(pick_up_screen, lv_color_hex(0xffffff), LV_PART_MAIN);
    lv_obj_set_style_bg_opa(pick_up_screen, LV_OPA_COVER, LV_PART_MAIN); // 填充

    // 创建标题
    lv_obj_t * title = lv_label_create(pick_up_screen);
    if(title) {
        lv_label_set_text(title, "电影取票");
        lv_obj_set_style_text_font(title, &SourceHanSansCN_Light_2_16_all, LV_PART_MAIN);
        lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 10); // 顶部居中
    }

    // 在 pick_up_screen_init 中调用自定义键盘函数
    create_pick_up_keyboard(pick_up_screen);

    // 创建按钮 返回
    lv_obj_t * return_btn = lv_btn_create(pick_up_screen);
    if(return_btn) {
        lv_obj_set_size(return_btn, 80, 40);                // 设置明确尺寸
        lv_obj_align(return_btn, LV_ALIGN_TOP_RIGHT, 0, 0); // 留出边距
        // 默认状态：浅灰色背景
        lv_obj_set_style_bg_color(return_btn, lv_color_hex(0xf0f0f0), LV_STATE_DEFAULT);
        // 按下状态：深灰色背景（添加点击反馈）
        lv_obj_set_style_bg_color(return_btn, lv_color_hex(0xc0c0c0), LV_STATE_PRESSED);
        lv_obj_set_style_bg_opa(return_btn, LV_OPA_COVER, LV_STATE_DEFAULT); // 完全不透明
        lv_obj_set_style_radius(return_btn, 5, 0);                           // 圆角

        lv_obj_t * label5 = lv_label_create(return_btn);
        if(label5) {
            lv_obj_set_style_text_font(label5, &SourceHanSansCN_Light_2_16_all, LV_PART_MAIN);
            lv_label_set_text(label5, "返回");
            lv_obj_align(label5, LV_ALIGN_CENTER, 0, 0);
            lv_obj_set_style_text_color(label5, lv_color_hex(0x000000), LV_PART_MAIN);
        }

        lv_obj_add_event_cb(return_btn, pick_up_button_click_handler, LV_EVENT_CLICKED, NULL); // 点击事件
        lv_obj_add_flag(return_btn, LV_OBJ_FLAG_CLICKABLE);                                    // 可点击
        lv_obj_clear_flag(return_btn, LV_OBJ_FLAG_SCROLLABLE);                                 // 取消滚动
    }

    // 使用渐变动画加载界面
    lv_scr_load_anim(pick_up_screen, LV_SCR_LOAD_ANIM_FADE_ON, 300, 0, false);
}